%option yylineno

%{
	// Identifica a sintaxe da MiniJava
%}

DIG		[0-9]
LETRA		[a-zA-Z]
LETRAM		[A-Z]
ID		("_"|{LETRA})({LETRA}|{DIG}|"_")*
TIPO		("int []"|"int"|"boolean")	
ESPB		[\n\t ]+
LITERALINT      ("+"|"-")?{DIG}+
LITERALSTR      ^[""]({LETRA}|{DIG})*{ESPB}""
COMENT		("//".*\n)
OPA		("+"|"-"|"*"|"/")
OPC		("==","!=","<",">","<=",">=")
OPL		("&&"|"||")
OPLN		"!"
CLASS		"class"

%x comentario1
%x comentario2

%%
        int num_linea = 1;
        int invocador_comentario;

"/*"         {
             invocador_comentario = INITIAL;
             BEGIN(comentario1);
             }

<comentario1>[^*\n]* 
<comentario1>"*"+[^*/\n]* 
<comentario1>\n             ++num_linea;
<comentario1>"*"+"/"        BEGIN(invocador_comentario);

"/**"     {
             invocador_comentario = INITIAL;
             BEGIN(comentario2);
             }

<comentario2>[^*\n]* 
<comentario2>"*"+[^*/\n]* 
<comentario2>\n             ++num_linea;
<comentario2>"*"+"/"        BEGIN(invocador_comentario);

{COMENT}	 ;
{ID}		 return ID; 
{TIPO}		 return TIPO; 
{ESPB}		 ;
{LITERALINT}     return LITINT;
{LITERALSTR}     return LITSTR;
{OPA}		 return OPA;
{OPC}		 return OPC;
{OPL}		 return OPL;
{OPLN}		 return OPLN;
"("		 return PA;
")"		 return PF;
"="		 return IG;
"["		 return CA;
"]"		 return CF;
"}"		 return XA;
"{"		 return XF;
"."		 return PT; 
","		 return V;
";"              return PV; 


%%

yywrap()
{
	return 1;
}
